""""
该脚本用于处理网格数据，依次处理：GridA.out，GridB.out
第一次运行：
    输入：GridA.out
    输出：result2.xlsx
第二次运行：
    输入：GridB.out
    输出：GridB_change.xlsx

"""



file_path_1= r"输入所需处理的文件（txt）"
x_list=[]
y_list=[]
count=0
prev_line=None
with open (file_path_1,'r',encoding='utf-8') as file:
    for line in file:
        line=line.strip()
        if line == 'SPECGRID':
            prev_line='SPECGRID'
            continue
        if prev_line=='SPECGRID':
            line=line.split()
            x_num=int(line[0])
            y_num=int(line[1])
            z_num=int(line[2])
            break
##上述代码把任意给的网格模型i,j,k方向上网格数量统计出来了，分别放在x_num,y_num,z_num变量里面
with open(file_path_1, 'r',encoding='utf-8') as file:
    count_line=0                #计数器，记录多少行，一般来说COORD关键字下有(x_num+1)*(y_num+1)行数据
    found_coord = False         # 标记是否找到了 COORD 行
    for line in file:
        line = line.strip()     # 去除行尾的空白字符和换行符          
        if 'COORD' in line:     # 检查当前行是否为 COORD
            found_coord = True
            continue            # 跳过这一行，直接读取下一行             
        if found_coord:         # 如果找到了 COORD，接下来读取下一行数据,而我只需要每一行前两个数据就行，即x坐标和y坐标
            count_line+=1
            if count_line<=(x_num+1)*(y_num+1):
                data_items = line.split()  # 默认按空格拆分 此时data_items的格式是""0","0","-800","0","0","-200"",我只需要这个列表前两个数据     
                if data_items[0] not in x_list:#如果这一行第一个数字没有被记录在x_list这个列表里，那这个数字就会被写入这个列表
                    x_list.append(data_items[0])
                if data_items[1] not in y_list:
                    y_list.append(data_items[1])
##以上代码成功实现了把给的网格模型里面x坐标，y坐标放入两个列表里，即x_list,y_list
##接下来的代码负责解决深度值的重复问题，并将网格模型里面的每个点坐标列入point这个列表里
def count_shared_cubes(x, y, z):##这个函数负责把每个点被多少个正方体共用算出来
    if (x==0 and y==0 and z==0) or (x==0 and y==0 and z==z_num) or (x==x_num and y==0 and z==0) or (x==x_num and y==0 and z==z_num) or (x==x_num and y==y_num and z==0) or (x==x_num and y==y_num and z==z_num) or (x==0 and y==y_num and z==0) or (x==0 and y==y_num and z==z_num):
        return 1
    else:
        if (y==0 and z==0) or (x==0 and z==0) or (x==x_num and z==0) or (y==y_num and z==0) or (y==0 and z==z_num) or (x==0 and z==z_num) or (x==x_num and z==z_num) or (y==y_num and z==z_num) or (x==0 and y==0) or (x==x_num and y==0) or (x==0 and y==y_num) or (x==x_num and y==y_num):
            return 2
        else:
            if z==0 or z==z_num or y==0 or y==y_num or x==0 or x==x_num:
                return 4
            else:
                return 8
with open(file_path_1, 'r',encoding='utf-8') as file:
    found_zcorn = False  # 标记是否找到了 ZCORN 行
    depth_data = []  # 用于存储所有 ZCORN 数据
    for line in file:
        line = line.strip()  # 去除行尾的空白字符和换行符           
        # 检查当前行是否为 ZCORN
        if 'ZCORN' in line:
            found_zcorn = True
            continue  # 跳过 ZCORN 行，直接读取下一行                
        # 如果找到了 ZCORN，开始收集数据,即以下代码
        if found_zcorn:
            # 将当前行拆分成多个数据项，并加入 data 列表
            depth_data.extend(line.split())  # 默认按空格拆分               
            # 检查是否已经收集到足够的数据
            if len(depth_data) == 8*x_num*y_num*z_num:
                break
count=0
point=[]
num2=0
num1=0
for k in range(z_num+1):
    for j in range(y_num+1):
        for i in range(x_num+1):
            if len(point) <= count:
                point.append([[], [], []])
            num2=num1+num2##num2代表此前出现的depth_data的数据次数,num1+num2代表此前所有数据之和加上目前这个数据所重复的次数
            num1=count_shared_cubes(i,j,k)#num1代表此次第count个单元的深度值重复次数
            point[count][0].append(x_list[i])##把第count个单元的x坐标输入列表
            point[count][1].append(y_list[j])##把第count个单元的y坐标输入列表
            point[count][2].append(depth_data[num1+num2-1])
            count+=1
# 将 point 列表中的所有数据转换为浮点型
for i in range(len(point)):
    point[i][0] = [float(x) for x in point[i][0]]  # 将 x_list 中的所有值转换为浮点型
    point[i][1] = [float(y) for y in point[i][1]]  # 将 y_list 中的所有值转换为浮点型
    point[i][2] = [float(depth) for depth in point[i][2]]  # 将 depth_data 中的所有值转换为浮点型
##以下代码实现把point数据导入excel表格
import pandas as pd
# 提取每个三维子列表中的数值，并转换为二维列表
flattened_point = [[p[0][0], p[1][0], p[2][0]] for p in point]
# 直接转换为 DataFrame
df = pd.DataFrame(flattened_point, columns=["X", "Y", "Depth"])
# 导出到 Excel 文件，指定小数点保留十位
df.to_excel(r"保存至指定位置excel表格", index=False, float_format="%.10f")



























